#include "dx9driver.h"

dx9driver::dx9driver() {
	g_pD3D = NULL;
	g_pd3dDevice = NULL;
}

dx9driver::~dx9driver() {
	//Cleanup();
}

HRESULT dx9driver::InitD3D(HWND hWnd) {
	// Create the D3D object, which is needed to create the D3DDevice.
  if (NULL == (g_pD3D = Direct3DCreate9(D3D_SDK_VERSION)))
    return E_FAIL;

  // Set up the structure used to create the D3DDevice. Most parameters are
  // zeroed out. We set Windowed to TRUE, since we want to do D3D in a
  // window, and then set the SwapEffect to "discard", which is the most
  // efficient method of presenting the back buffer to the display.  And 
  // we request a back buffer format that matches the current desktop display 
  // format.
  D3DPRESENT_PARAMETERS d3dpp;
  ZeroMemory(&d3dpp, sizeof(d3dpp));
  d3dpp.Windowed = TRUE;
  d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;
  d3dpp.BackBufferFormat = D3DFMT_UNKNOWN;

  // Create the Direct3D device. Here we are using the default adapter (most
  // systems only have one, unless they have multiple graphics hardware cards
  // installed) and requesting the HAL (which is saying we want the hardware
  // device rather than a software one). Software vertex processing is 
  // specified since we know it will work on all cards. On cards that support 
  // hardware vertex processing, though, we would see a big performance gain 
  // by specifying hardware vertex processing.
  if (FAILED(g_pD3D->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hWnd,
                                 D3DCREATE_SOFTWARE_VERTEXPROCESSING,
                                 &d3dpp, &g_pd3dDevice))) {
    return E_FAIL;
  }

	// Turn off culling, so we see the front and back of the triangle
    g_pd3dDevice->SetRenderState( D3DRS_CULLMODE, D3DCULL_NONE );

    // Turn off D3D lighting, since we are providing our own vertex colors
    g_pd3dDevice->SetRenderState( D3DRS_LIGHTING, FALSE );

  // Device state would normally be set here

  return S_OK;
}

void dx9driver::Render() {

	if (NULL == g_pd3dDevice)
    return;

  // Clear the backbuffer to a blue color
  g_pd3dDevice->Clear( 0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB( 0, 0, 255 ), 1.0f, 0 );

  // Begin the scene
  if (SUCCEEDED(g_pd3dDevice->BeginScene())) {
    // Rendering of scene objects can happen here

    // End the scene
    g_pd3dDevice->EndScene();
  }

  // Present the backbuffer contents to the display
  g_pd3dDevice->Present( NULL, NULL, NULL, NULL );
}

void dx9driver::Cleanup() {
	if (g_pd3dDevice != NULL)
    g_pd3dDevice->Release();

  if (g_pD3D != NULL)
    g_pD3D->Release();
}

void dx9driver::beginRender() {
	if (NULL == g_pd3dDevice)
    return;

  // Clear the backbuffer to a blue color
  g_pd3dDevice->Clear( 0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB( 0, 0, 255 ), 1.0f, 0 );

	g_pd3dDevice->BeginScene();

}

void dx9driver::endRender() {
	g_pd3dDevice->EndScene();
	g_pd3dDevice->Present( NULL, NULL, NULL, NULL );
}

LPDIRECT3DDEVICE9 dx9driver::getDriver() {
	return g_pd3dDevice;
}